//
//  HMSinaStatusDAL.swift
//  ZJCSina
//
//  Created by 朱建超 on 16/11/29.
//  Copyright © 2016年 itHeiMa. All rights reserved.
//

import UIKit

private let guoQi_date : Double = -7 * 24 * 60 * 60

class HMSinaStatusDAL: NSObject {

    //首页加载的数据的迁移
    class func loadHomeData(sinceId : Int64 , maxId : Int64 , finished : @escaping ([[String : Any]]?) -> ()) {
        
        let res = checkStatus(sinceId: sinceId, maxId: maxId)
        
        //if let result  ',' 逗号后面可以取到赋值的结果
        if let result = res , result.count > 0 {
            
            //有缓存数据
            finished(result)
            return
            
        }
        //没有返回数据，请求网络数据
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        let parameters = ["access_token" : HMSinaUserAccountViewModel.shared.access_token,
                          "max_id" : "\(maxId )",
            "since_id" : "\(sinceId)"]
        
        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            
            if error != nil{
            
                //告诉外界已经失败 在闭包中如何完成失败的回调
                finished(nil)
                return
            
            }
            
            //成功
            let dict = responseObject as! [String : Any]
            
            //尝试转换为字典类型的数组
            guard let array = dict["statuses"] as? [[String : Any]] else{
                
                finished(nil)
                return
                
            }
            
            //回调网络请求的结果
            finished(array)
            //存储到本地
            cacheStatus(array: array)
            
        }
        
    }
    
    //检查本地是否有缓存数据
    class func checkStatus(sinceId : Int64 , maxId : Int64) -> [[String : Any]]?{
    
        guard let userId = HMSinaUserAccountViewModel.shared.userAccount?.uid else{
        
            return nil
        
        }
        
        //会将数据库中所有的数据都查找到
        var sqlite = "SELECT status FROM T_Status WHERE userId = \(userId) "
        
        //拼接sqlite
        //如果sinceId>0，表示需要查找新的数据
        if sinceId > 0 {
            //向上查找
            sqlite += "AND statusId > \(sinceId) "
            
        }
        
        if maxId > 0 {
            //向下查找
            sqlite += "AND statusId < \(maxId) "
            
        }
        
        //排序 降序
        sqlite += "ORDER BY statusId DESC "
        
        //限制条数
        sqlite += "LIMIT 40"
        
        print(sqlite)
        
        //实例化数据
        var array = [[String : Any]]()
        
        HMSQLiteTools.shared.queue.inDatabase { (db) in
            
            let result = db?.executeQuery(sqlite, withArgumentsIn: nil)
            
            //逐条获取数据
            while (result?.next())!{
            
                //获取status
                let jsonData = result?.data(forColumn: "status")
                
                //转换为josn字典
                let dict = try! JSONSerialization.jsonObject(with: jsonData!, options: [])
                
                array.append(dict as! [String : Any])
            
            }
            
        }
        
        return array
    
    }
    
    //如果本地有缓存数据，就直接返回本地的缓存数据，给用户节省流量，让用户在没有网络的情况下可以浏览之前的内容
    
    //如果没有缓存数据，就请求网络数据，返回网络数据
    
    //获取网络数据之后，应该立即存储网络数据
    class func cacheStatus(array : [[String : Any]]){

        //statusId、status、userId
        //获取userId
        guard let userId = HMSinaUserAccountViewModel.shared.userAccount?.uid else{
        
            print("用户没有登录")
            return
        
        }
        
        let sqlite = "INSERT OR REPLACE INTO T_Status (statusId,status,userId) VALUES (?,?,?)"
        
        HMSQLiteTools.shared.queue.inTransaction { (db, rollback) in
            
            
            for item in array {
                
                let statusId = item["id"]
                
                //数据库中能够存储的数据不能够是Foundation，需要将字典数据转换二进制数据存储到数据库中
                //如果是字典数据，在存储的时候会有问题
                let jsonData = try! JSONSerialization.data(withJSONObject: item, options: [])
                
                let result = db?.executeUpdate(sqlite, withArgumentsIn: [statusId!,jsonData,userId])
                
                if !result!{
                
                    //不成功就执行回滚
                    rollback?.pointee = true
                
                    return
                }
                
            }
            
        }
    
    }
    
    //在什么时候清除  7天之前的微博
    class func clearCacheStatus() {
        
        //根据设置的过期描述  和当前日期 计算需要删除的微博记录
        let date = Date(timeIntervalSinceNow: TimeInterval(guoQi_date))
        //yyyy-MM-dd HH:mm:ss
        let formater = DateFormatter()
        //设置本地化信息
        formater.locale = Locale(identifier: "en")
        //设置格式化符号
        formater.dateFormat = "yyyy-MM-dd HH:mm:ss"
        //获取日期的字符串
        let dateString = formater.string(from: date)
        
        let sqlite = "DELETE FROM T_Status WHERE creat_date < (?)"
        
        //执行sqlite
        HMSQLiteTools.shared.queue.inTransaction { (db, rollback) in
            
            let result = db?.executeUpdate(sqlite, withArgumentsIn: [dateString])
            
            if !result!{
                
                //执行回滚
                rollback?.pointee = true
                
            }
            
        }
        
    }
    
}
